﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Threading;
using GPS;
using Meteo.Desktop;
using Mapa.SNWS;
using System.Collections;
using MCDS;
using WindowsFormsApplication7;

namespace Cartography.Desktop
{
    public partial class FormPrincipal : Form, GPSInterface, MeteoInterface, MCDSInterface
    {
        private Map mapa;
        private int displacementZoom, zoom, displacementTileX, displacementTileY;
        private string tilesFolder;
        private LatLon ne, sw;
        private static FormPrincipal instancia = null;
        private Boolean linkearEmergencia=false;
        Boolean dibujardistancia = false;
        Boolean dibujardistancia2 = false;
        Boolean dibujarAreaDeRiesgo = false;
        private Thread threadGPS;
        private Thread threadMeteo;
        private Thread threadMCDS;
        private LatLon posGPS;
        LatLon aux = new LatLon();
        private int correlativo = 0;
        private Emergencia proxy;
        private int vecesActualizacion = 0;
        private FormPrincipal()
        {
            InitializeComponent();
            displacementZoom = displacementTileX = displacementTileY = 0;
            tilesFolder = "";
            mapa = null;
            MeteoService.add(this);
            this.threadMeteo = new Thread(new ThreadStart(MeteoService.service));
            MCDSService.add(this);
            this.threadMCDS = new Thread(new ThreadStart(MCDSService.service));
            proxy = new Emergencia();
        
        }
        public static FormPrincipal Instance
        {
            get
            {
                if (instancia == null)
                {
                    instancia = new FormPrincipal();
                }
                return instancia;
            }
        }
        public Boolean cbImagenSatelital_Enable
        {
            set
            {
                this.cbImagenSatelital.Enabled = value;
            }
            get 
            {
                return this.cbImagenSatelital.Enabled;
            }
        }
        public Boolean cbImagenSatelital_Checked
        {
            set
            {
                this.cbImagenSatelital.Checked = value;
            }
            get
            {
                return this.cbImagenSatelital.Checked;
            }
        }
        private delegate void dibujarPto(double lat, double lon);

        public Thread ThreadGPS
        {
            set
            {
                this.threadGPS = value;
            }
            get
            {
                return this.threadGPS;
            }
        }
        public ToolStripStatusLabel GPStatus
        {
            get
            {
                return this.gpsStatus;
            }
        }
        public LatLon NE
        {
            get
            {
                return ne;
            }
            set
            {
                this.ne = value;
            }
        }
        public LatLon posicionGPS
        {
            get
            {
                return posGPS;
            }
            set
            {
                this.posGPS = value;
            }
        }
        public LatLon SW
        {
            get
            {
                return sw;
            }
            set
            {
                this.sw = value;
            }
        }
        public void updateFiles()
        {
            string[] zoomLevels = System.IO.Directory.GetDirectories(tilesFolder + "\\");
            this.panelMapa.Refresh();
            if (mapa == null)
            {
                mapa = new Map(ne, sw, zoom, this.panelMapa.Width, this.panelMapa.Height, tilesFolder, 256, displacementZoom, displacementTileX, displacementTileY);
                mapa.Parent = this;
                mapa.Dock = System.Windows.Forms.DockStyle.Fill;
                
            }
            else
            {
                mapa = new Map(mapa.Zoom, mapa.Centro, ne, sw, zoom, this.panelMapa.Width, this.panelMapa.Height, tilesFolder, 256, displacementZoom, displacementTileX, displacementTileY);
                mapa.move(-1, -1);
                mapa.move(1, 1);
                mapa.Parent = this;
                mapa.Dock = System.Windows.Forms.DockStyle.Fill;
            }
            this.panelMapa.Controls.Clear();
            //this.toolStripContainer1.ContentPanel.Controls.Remove(this.panelMapa);
            //this.panelMapa = mapa.Panel;
            mapa.Panel.Location = new System.Drawing.Point(0, 0);
            this.panelMapa.Controls.Add(mapa.Panel);
            this.mapa.refresh();
            //this.panelMapa.Controls.Add(this.panelMapa);
            //this.toolStripContainer1.ContentPanel.Controls.Add(this.panelMapa);
            //this.Refresh();

            //-------------------------------------------Aldo empezo a programar-------------------------------------------
            loadAddPointOfInterest();
            this.loadSelectDest();
            //-------------------------------------------Aldo termino de programar-----------------------------------------
        }
        private void loadSelectDest()
        {
            //aceptButton1.Enabled = false;
            obsLabel.Text = "Observación:\r\n\r\n" +
                sw.Latitude + " < Latitud < " + ne.Latitude + "\r\n" +
                    sw.Longitude + " < Longitud < " + ne.Longitude;
        }
        private void selectFolder(object sender, EventArgs e)
        {
            folderBrowserDialog1.SelectedPath = this.tilesFolder;
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                this.tilesFolder = folderBrowserDialog1.SelectedPath;
                XmlDocument doc = new XmlDocument();
                try
                {
                    System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                    doc.Load(this.tilesFolder + "\\info.xml");
                    this.ne = new LatLon(double.Parse(doc.SelectSingleNode("/configuration/corners/ne/lat").InnerText, nfi), double.Parse(doc.SelectSingleNode("/configuration/corners/ne/lon").InnerText, nfi));
                    this.sw = new LatLon(double.Parse(doc.SelectSingleNode("/configuration/corners/sw/lat").InnerText, nfi), double.Parse(doc.SelectSingleNode("/configuration/corners/sw/lon").InnerText, nfi));
                    this.zoom = int.Parse(doc.SelectSingleNode("/configuration/zoomLevels").InnerText);
                    this.displacementZoom = int.Parse(doc.SelectSingleNode("/configuration/displacement/zoom").InnerText);
                    this.displacementTileX = int.Parse(doc.SelectSingleNode("/configuration/displacement/tileX").InnerText);
                    this.displacementTileY = int.Parse(doc.SelectSingleNode("/configuration/displacement/tileY").InnerText);
                    this.eliminarEmergencia(); 
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Archivo de configuracion no valido " + ex.Message);
                    return;
                }
                if(!threadMeteo.IsAlive) 
                    this.threadMeteo.Start();
                MCDSService.TilesPath = this.tilesFolder;
                if(!threadMCDS.IsAlive)
                    this.threadMCDS.Start();
                updateFiles();
            }
        }


        private void maximiza(object sender, EventArgs e)
        {
            this.panelMapa.Invalidate();
            this.panelMapa.Refresh();
            if (this.tilesFolder != "")
                updateFiles();
        }
        #region Miembros de MeteoInterface

        public void notify(MeteoData dat)
        {
            if (dat != null && this.mapa!=null)
            {
                // Setear el label del mapa con la información
                if (this.mapa.InvokeRequired)
                {
                    this.mapa.Invoke(new Map.setMeteoDataCallback(this.mapa.setMeteoData),
                        new object[] { dat });
                }
                else
                {
                    this.mapa.setMeteoData(dat);
                }
                // Setear el label de estado
                if (this.InvokeRequired)
                {
                    this.Invoke(new FormPrincipal.setMeteoStatusTextCallback(this.setMeteoStatus),
                        new object[] { "Información meteorológica obtenida" });
                }
                else
                {
                    this.setMeteoStatus("Información meteorológica obtenida");
                }
            }
            else
            {
                //No hay conexión, setear el label de estado
                if (this.InvokeRequired)
                {
                    this.Invoke(new FormPrincipal.setMeteoStatusTextCallback(this.setMeteoStatus),
                        new object[] { "Sin conexión meteorológica" });
                }
                else
                {
                    this.setMeteoStatus("Sin conexión meteorológica");
                }
            }
        }

        #endregion
        public delegate void setMeteoStatusTextCallback(string text);

        public void setMeteoStatus(string text)
        {
            this.meteoStatus.Text = text;
        }
        private double completarDigitos(string numero, int digitos)
        {
            while (numero.Length != digitos) numero += "0";
            return double.Parse(numero);
        }
        #region Miembros de MCDS

        public void notify(List<ucMCDS> recomendaciones)
        {
            if (recomendaciones != null && this.mapa != null)
            {
                if (this.InvokeRequired)
                {
                    this.mapa.Invoke(new FormPrincipal.setRecomendacionesCallback(this.setRecomendaciones),
                    new object[] { recomendaciones });
                }
            }

        }

        #endregion
        public delegate void setRecomendacionesCallback(List<ucMCDS> recomendaciones);

        public void setRecomendaciones(List<ucMCDS> recomendaciones)
        {
            this.flpRecomendaciones.Controls.Clear();
            foreach (ucMCDS recomendacion in recomendaciones)
            {
                recomendacion.botonMostrar.Click += new System.EventHandler(recomendacionBotonMostrar_Click);
                this.flpRecomendaciones.Controls.Add(recomendacion);
            }
        }
        #region Miembros de GPSInterface

        public void notify(LatLon pos)
        {
            if (pos != null &&this.mapa !=null)
            {
                LatLon cornerNW = this.mapa.cornerNW();
                LatLon cornerSE = this.mapa.cornerSE();
                this.vecesActualizacion++;
                if (this.vecesActualizacion >= 6 && this.correlativo!=0) 
                {
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(this.proxy.CarrosEmergencia2(this.correlativo.ToString()));
                    doc.Save(this.tilesFolder + "\\PointsOfInterest\\CarrosEmergencia.xml");
                    this.vecesActualizacion = 0;
                    this.mapa.actualizarPuntosDeInteres();
                }
                if ((pos.Latitude >= cornerSE.Latitude) && (pos.Longitude <= cornerSE.Longitude) &&
                        (pos.Latitude <= cornerNW.Latitude) && (pos.Longitude >= cornerNW.Longitude))
                {
                    if (posGPS != null)
                    {
                        int decimales = 5;
                        aux.Latitude = Math.Round(pos.Latitude, decimales);
                        aux.Longitude = Math.Round(pos.Longitude, decimales);
                        if (aux.Longitude != posGPS.Longitude && aux.Latitude != posGPS.Latitude)
                        {

                            notifyPartido(pos);
                            this.gpsStatus.Text = "GPS Configurado - Posición obtenida";
                        }
                    }
                    else
                    {
                        notifyPartido(pos);
                        this.gpsStatus.Text = "GPS Configurado - Posición obtenida";
                    }
                }
            }
            else
            {
                this.gpsStatus.Text = "GPS Configurado - Triangulando posición";
            }
        }
        private void notifyPartido(LatLon pos) 
        {
            double lon = pos.Longitude;
            double lat = pos.Latitude;
            posGPS = aux;
            if (this.mapa.InvokeRequired)
            {
                // Método con el cual se le avisa al formulario principal que los datos del GPS variaron.
                this.mapa.Invoke(new Map.printPointCallback(this.mapa.printPoint),
                    new object[] { lat, lon });
            }
            else
            {
                this.mapa.printPoint(lat, lon);
            }
        }

        #endregion
        //private void loadForm(object sender, EventArgs e)
        //{
        //    this.tilesFolder = System.IO.Directory.GetCurrentDirectory() + "\\Santiago";
        //    this.Width = 1000;
        //    this.Height = 630;
        //    loadConf();
        //}

        private void loadConf()
        {
            XmlDocument doc = new XmlDocument();
            try
            {
                System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                doc.Load(this.tilesFolder + "\\info.xml");
                this.ne = new LatLon(double.Parse(doc.SelectSingleNode("/configuration/corners/ne/lat").InnerText, nfi), double.Parse(doc.SelectSingleNode("/configuration/corners/ne/lon").InnerText, nfi));
                this.sw = new LatLon(double.Parse(doc.SelectSingleNode("/configuration/corners/sw/lat").InnerText, nfi), double.Parse(doc.SelectSingleNode("/configuration/corners/sw/lon").InnerText, nfi));
                this.zoom = int.Parse(doc.SelectSingleNode("/configuration/zoomLevels").InnerText);
                this.displacementZoom = int.Parse(doc.SelectSingleNode("/configuration/displacement/zoom").InnerText);
                this.displacementTileX = int.Parse(doc.SelectSingleNode("/configuration/displacement/tileX").InnerText);
                this.displacementTileY = int.Parse(doc.SelectSingleNode("/configuration/displacement/tileY").InnerText);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Archivo de configuracion no valido " + ex.Message);
                return;
            }
            //this.threadMeteo.Start();
            updateFiles();
        }

        private void close(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void changeGrifo(object sender, EventArgs e)
        {
            this.mapa.changeLayer("grifo");
            mapa.zoom(mapa.Zoom);
            mapa.refresh();
        }

        private void changeCarabineros(object sender, EventArgs e)
        {
            this.mapa.changeLayer("carabineros");
            mapa.zoom(mapa.Zoom);
            mapa.refresh();
        }

        private void changeHospital(object sender, EventArgs e)
        {
            this.mapa.changeLayer("hospital");
            mapa.zoom(mapa.Zoom);
            mapa.refresh();
        }

        private void bombCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            this.mapa.changeLayer("bomberos");
            mapa.zoom(mapa.Zoom);
            mapa.refresh();
        }



        //-------------------------------------------Aldo empezo a programar-------------------------------------------


        private void addPointOfInterest_TextChanged(object sender, EventArgs e)
        {
            if (groupSelect1.SelectedItem != null && !eastTextBox.Text.Equals("") &&
                !northTextBox.Text.Equals("") && !nameTextBox.Text.Equals("") &&
                !addressLabel.Text.Equals(""))
            {
                try
                {
                    double.Parse(eastTextBox.Text);
                    double.Parse(northTextBox.Text);

                    okButton1.Enabled = true;
                }
                catch
                {
                }
            }
            else
                okButton1.Enabled = false;
        }

        private void loadAddPointOfInterest()
        {
            okButton1.Enabled = false;
            string[] data = mapa.GetTypes();
            groupSelect1.Items.AddRange(data);
        }

        private void okButton1_Click(object sender, EventArgs e)
        {
            try
            {
                double.Parse(northTextBox.Text);
            }
            catch
            {
                MessageBox.Show("Coordenada errónea para el norte.");
                northTextBox.ResetText();
                northTextBox.Focus();
                return;
            }

            try
            {
                double.Parse(eastTextBox.Text);
            }
            catch
            {
                MessageBox.Show("Coordenada errónea para el este.");
                eastTextBox.ResetText();
                eastTextBox.Focus();
                return;
            }
            mapa.AddPoint(groupSelect1.SelectedItem.ToString(), nameTextBox.Text, addressTextBox.Text,
                northTextBox.Text, eastTextBox.Text, descriptionRichTextBox.Text);
            MessageBox.Show("Se ha agregado exitosamente " + nameTextBox.Text + " a " +
                groupSelect1.SelectedItem.ToString() + ".");
        }
        public Boolean LinkearEmergencia
        {
            get
            {
                return this.linkearEmergencia;
            }
            set
            {
                this.linkearEmergencia = value;
            }
        }
        public Map Mapa
        {
            get 
            {
                return this.mapa;
            }
        }
        public System.Windows.Forms.TabPage PanelMapa
        {
            get 
            {
                return this.panelMapa;
            }
        }
        private void panelMapa_Resize(object sender, EventArgs e)
        {
            if (this.mapa!=null)
            if ((this.PanelMapa.Width > 0) && (this.PanelMapa.Width >0))
            {
                this.panelMapa.Invalidate();
                this.updateFiles();
            }
        }
        private void cerrarToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void toolStripButton7_Click(object sender, EventArgs e)
        {
            XmlDocument documento;
            LatLon tmpCoordenadas;
            XmlNode nodo;
            string temp;
            if(this.mapa!=null)
            if (System.IO.File.Exists(this.mapa.PathData + "\\PointsOfInterest\\Emergencia.xml"))
            {
                documento = new XmlDocument();
                documento.Load(this.mapa.PathData + "\\PointsOfInterest\\Emergencia.xml");
                tmpCoordenadas = new LatLon();
                System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                nodo = documento.SelectSingleNode("PointsOfInterest/Points/Point/Coordinates/Latitude");
                temp = nodo.InnerText;
                tmpCoordenadas.Latitude = double.Parse(temp, nfi);
                nodo = documento.SelectSingleNode("PointsOfInterest/Points/Point/Coordinates/Longitude");
                temp = nodo.InnerText;
                tmpCoordenadas.Longitude = double.Parse(temp, nfi);
                mapa.Centro = tmpCoordenadas;
                mapa.zoom(mapa.Zoom);
                mapa.refresh();
            }
            else
            {
                if (System.IO.File.Exists(this.mapa.PathData + "\\PointsOfInterest\\EdificioEmergencia.xml"))
                {
                    documento = new XmlDocument();
                    documento.Load(this.mapa.PathData + "\\PointsOfInterest\\EdificioEmergencia.xml");
                    tmpCoordenadas = new LatLon();
                    System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                    nodo = documento.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Centroide/Latitud");
                    temp = nodo.InnerText;
                    tmpCoordenadas.Latitude = double.Parse(temp, nfi);
                    nodo = documento.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Centroide/Longitud");
                    temp = nodo.InnerText;
                    tmpCoordenadas.Longitude = double.Parse(temp, nfi);
                    mapa.Centro = tmpCoordenadas;
                    mapa.zoom(mapa.Zoom);
                    mapa.refresh();
                }
            }
        }

        private void toolStripButton9_Click(object sender, EventArgs e)
        {
            if(this.mapa!=null)
            if (this.mapa.Dibujar)
            {
                this.mapa.Dibujar = false;
                this.areaToolStripButton.Checked = false;
            }
            else
            {
                this.mapa.Dibujar = true;
                this.areaToolStripButton.Checked = true;
            }
        }

        private void toolStripButton10_Click(object sender, EventArgs e)
        {
            if (this.mapa != null)
            this.mapa.zoomIn();
        }

        private void toolStripButton11_Click(object sender, EventArgs e)
        {
            if (this.mapa != null)
            this.mapa.zoomOut();
        }

        private void toolStripButton12_Click(object sender, EventArgs e)
        {
            //Linkea la emergencia con un edificio
            if (this.mapa != null)
            {
                if (System.IO.File.Exists(tilesFolder + "\\PointsOfInterest\\Emergencia.xml"))
                {
                    linkearEmergencia = true;
                }
                else
                {
                    MessageBox.Show("No existe el arcivo de emergencia.");
                }
            }
            else 
            {
                this.toolStripButton12.Checked = false;
            }
        }
        public void cambiarLatLonEmergencia(LatLon coordenadas)
        {
            try
            {
                System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                proxy.ActualizarPosicionEmergencia(correlativo.ToString(), coordenadas.Latitude.ToString(nfi), coordenadas.Longitude.ToString(nfi));
            }
            catch (Exception e) 
            {
                MessageBox.Show("Problema con la conexión."+Environment.NewLine+e.ToString());
            }
        }

        private void toolStripButton8_Click(object sender, EventArgs e)
        {
            if (dibujardistancia)
            {
                dibujardistancia = false;
                dibujardistancia2 = false;
                mapa.P1 = new System.Drawing.Point();
                mapa.P2 = new System.Drawing.Point();
                mapa.refresh();
            }
            else 
            {
                dibujardistancia = true;
            }
            
        }
        public Boolean DibujarDistancia
        {
            get 
            {
                return this.dibujardistancia;
            }
        }
        public Boolean DibujarDistancia2
        {
            get
            {
                return this.dibujardistancia2;
            }
            set 
            {
                this.dibujardistancia2 = value;
            }
        }
        public Boolean DibujarAreaDeRiesgo
        {
            get
            {
                return this.dibujarAreaDeRiesgo;
            }
            set
            {
                this.dibujarAreaDeRiesgo = value;
            }
        }
        private void aceptButton1_Click(object sender, EventArgs e)
        {
            LatLon tmpCoordenadas = new LatLon();
            System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
            tmpCoordenadas.Longitude = double.Parse(this.lonLocTextBox.Text, nfi);
            tmpCoordenadas.Latitude = double.Parse(this.latLocTextBox.Text, nfi);
            mapa.Centro = tmpCoordenadas;
            mapa.zoom(mapa.Zoom);
            mapa.refresh();
        }

        private void configurarGPSToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
            ConfGPS form = new ConfGPS();
            form.GPSStatus = this.gpsStatus;
            form.FormPrincipal = this;

            // Agregar los puertos a la lista desplegable
            foreach (string port in ports)
            {
                
                if (port.EndsWith("w"))
                {
                    form.PortComboBox.Items.Add(port.Substring(0, port.Length - 1));
                }
                else 
                {
                    form.PortComboBox.Items.Add(port);
                }
                
            }

            form.ShowDialog();
        }

        private void opcionesGeneralesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConfGen conf = new ConfGen();

            conf.GpsNumeric.Value = (decimal)GPSService.UpdateTime;
            conf.MeteoNumeric.Value = (decimal)MeteoService.UpdateTime;

            conf.ShowDialog();
        }

        private void toolStripButton14_Click(object sender, EventArgs e)
        {
            if (posGPS != null && this.mapa!=null)
            {
                mapa.Centro = posGPS;
                mapa.zoom(mapa.Zoom);
                mapa.refresh();
            }
        }

        private void FormPrincipal_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (this.mapa != null)
            {
                if(this.threadGPS!=null) this.threadGPS.Abort();
                if(this.threadMeteo!= null) this.threadMeteo.Abort();
                if (this.threadMCDS != null) this.threadMCDS.Abort();
            }
        }
        private DataTable crearTablaLlamados() 
        {
            DataTable resultado = new DataTable("Lamados");
            resultado.Columns.Add("Correlativo", Type.GetType("System.String"));
            resultado.Columns.Add("Latitud", Type.GetType("System.String"));
            resultado.Columns.Add("Longitud", Type.GetType("System.String"));
            resultado.Columns.Add("Clave",Type.GetType("System.String"));
            resultado.Columns.Add("Acto", Type.GetType("System.String"));
            resultado.Columns.Add("Fecha", Type.GetType("System.String"));
            resultado.Columns.Add("Dirección", Type.GetType("System.String"));
            return resultado;
        }
        private void obtenerLlamados() 
        {

            string result = proxy.Llamados();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(result);
            DataTable llamados = crearTablaLlamados();
            

            //----------------------- se empieza a ver las emergencias----------------
            XmlNode nodoLlamados = doc.GetElementsByTagName("llamados")[0];
            if (nodoLlamados.ChildNodes.Count > 0)
            {
                IEnumerator ienum = nodoLlamados.GetEnumerator();
                XmlNode nodo;
                while (ienum.MoveNext())
                {
                    nodo = (XmlNode)ienum.Current;
                    DataRow fila = llamados.NewRow();
                    fila["Correlativo"] = nodo.SelectSingleNode("correlativo").InnerText;
                    fila["Clave"] = nodo.SelectSingleNode("clave").InnerText;
                    fila["Acto"] = nodo.SelectSingleNode("acto").InnerText;
                    fila["Fecha"] = nodo.SelectSingleNode("fecha").InnerText + "   " + nodo.SelectSingleNode("hora").InnerText.Substring(0,5); 
                    fila["Dirección"] = nodo.SelectSingleNode("direccion").InnerText;
                    fila["Latitud"] = nodo.SelectSingleNode("latitud").InnerText;
                    fila["Longitud"] = nodo.SelectSingleNode("longitud").InnerText;

                    llamados.Rows.Add(fila);
                }
            }
            //----------------------- se termina de ver las emergencias----------------

            dgvLlamados.DataSource = llamados;

            dgvLlamados.Columns["Correlativo"].Visible = false;
            dgvLlamados.Columns["Latitud"].Visible = false;
            dgvLlamados.Columns["Longitud"].Visible = false;
        }

        private void tab_SelectedIndexChanged(object sender, EventArgs e)
        {
           if(this.mapa!=null)
           switch (tab.SelectedTab.Name)
           {
               case "llamados":
                   this.obtenerLlamados();
                   break;
               case "estados":
                   this.obtenerMaterialMayor();
                   break;
           }
        }
        private DataTable crearTablaMaterialMayor()
        {
            DataTable resultado = new DataTable("Lamados");
            resultado.Columns.Add("ID", Type.GetType("System.String"));
            resultado.Columns.Add("Compañía", Type.GetType("System.String"));
            resultado.Columns.Add("Tipo", Type.GetType("System.String"));
            resultado.Columns.Add("Estado", Type.GetType("System.String"));
            resultado.Columns.Add("Chofer", Type.GetType("System.String"));
            resultado.Columns.Add("Hr. despacho", Type.GetType("System.String"));
            resultado.Columns.Add("Observaciones", Type.GetType("System.String"));
            resultado.Columns.Add("Latitud", Type.GetType("System.String"));
            resultado.Columns.Add("Longitud", Type.GetType("System.String"));
            resultado.Columns.Add("Distancia", Type.GetType("System.String"));
            return resultado;
        }
        private void obtenerMaterialMayor() 
        {
            DataTable materialMayor = this.crearTablaMaterialMayor();
            if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\CarrosEmergencia.xml")) 
            {
                XmlDocument docCarros = new XmlDocument();
                docCarros.Load(this.tilesFolder + "\\PointsOfInterest\\CarrosEmergencia.xml");
                //----------------------- se empieza a ver los carros----------------
                XmlNode nodoCarros = docCarros.GetElementsByTagName("Points")[0];
                if (nodoCarros.ChildNodes.Count > 0)
                {
                    IEnumerator ienum = nodoCarros.GetEnumerator();
                    XmlNode nodo;
                    LatLon posicion = new LatLon();
                    XmlDocument emergencia = new XmlDocument();
                    if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\Emergencia.xml"))
                    {
                        emergencia.Load(this.tilesFolder + "\\PointsOfInterest\\Emergencia.xml");
                        posicion.Latitude = double.Parse(emergencia.SelectSingleNode("PointsOfInterest/Points/Point/Coordinates/Latitude").InnerText, 
                            new System.Globalization.CultureInfo("en-US", false).NumberFormat);
                        posicion.Longitude = double.Parse(emergencia.SelectSingleNode("PointsOfInterest/Points/Point/Coordinates/Longitude").InnerText, 
                            new System.Globalization.CultureInfo("en-US", false).NumberFormat);
                    }

                    if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\EdificioEmergencia.xml"))
                    {
                        emergencia.Load(this.tilesFolder + "\\PointsOfInterest\\EdificioEmergencia.xml");
                        posicion.Latitude = double.Parse(emergencia.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Centroide/Latitud").InnerText, 
                            new System.Globalization.CultureInfo("en-US", false).NumberFormat);
                        posicion.Longitude = double.Parse(emergencia.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Centroide/Longitud").InnerText, 
                            new System.Globalization.CultureInfo("en-US", false).NumberFormat);
                    }
                    while (ienum.MoveNext())
                    {
                        nodo = (XmlNode)ienum.Current;
                        DataRow fila = materialMayor.NewRow();
                        fila["ID"] = nodo.SelectSingleNode("Name").InnerText;
                        fila["Compañía"] = nodo.SelectSingleNode("Compania").InnerText;
                        fila["Tipo"] = nodo.SelectSingleNode("Tipo").InnerText;
                        fila["Estado"] = nodo.SelectSingleNode("Estado").InnerText;
                        fila["Chofer"] = nodo.SelectSingleNode("Chofer").InnerText;
                        fila["Hr. despacho"] = nodo.SelectSingleNode("HoraDespacho").InnerText;
                        fila["Observaciones"] = nodo.SelectSingleNode("Observaciones").InnerText;
                        fila["Latitud"] = nodo.SelectSingleNode("Coordinates/Latitude").InnerText;
                        fila["Longitud"] = nodo.SelectSingleNode("Coordinates/Longitude").InnerText;
                        if(posicion!=null){
                            fila["Distancia"] =Math.Round(this.mapa.distanciaMts(posicion,new LatLon(fila["Latitud"].ToString(),fila["Longitud"].ToString())),2);
                        }
                        else
                        {
                            fila["Distancia"] = "No se puede calcular";
                        }
                        materialMayor.Rows.Add(fila);
                    }
                }
                //----------------------- se termina de ver los carros----------------

            }




            dgvMaterialMayor.DataSource = materialMayor;
            dgvMaterialMayor.Columns["Compañía"].Visible = false;
            dgvMaterialMayor.Columns["Tipo"].Visible = false;
            dgvMaterialMayor.Columns["Latitud"].Visible = false;
            dgvMaterialMayor.Columns["Longitud"].Visible = false;
        }
        private void eliminarEmergencia() 
        {
            if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\Emergencia.xml"))
                System.IO.File.Delete(this.tilesFolder + "\\PointsOfInterest\\Emergencia.xml");
            if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\EdificioEmergencia.xml"))
                System.IO.File.Delete(this.tilesFolder + "\\PointsOfInterest\\EdificioEmergencia.xml");
            if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\CarrosEmergencia.xml"))
                System.IO.File.Delete(this.tilesFolder + "\\PointsOfInterest\\CarrosEmergencia.xml");
        }
        private void setEmergencia() 
        {
            XmlDocument doc = new XmlDocument();
            XmlDocument xmlDocEdificios = new XmlDocument();
            doc.LoadXml(proxy.CallEmergencia(this.correlativo.ToString()));
            doc.Save(this.tilesFolder + "\\PointsOfInterest\\Emergencia.xml");
            if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\Edificios.xml"))
            {
                xmlDocEdificios.Load(this.tilesFolder + "\\PointsOfInterest\\Edificios.xml");
                string consulta = "PointsOfInterest/Edificios/Edificio[Centroide/Latitud=" +
                    dgvLlamados.SelectedRows[dgvLlamados.SelectedRows.Count - 1].Cells["Latitud"].Value.ToString()+
                    " and Centroide/Longitud="+
                    dgvLlamados.SelectedRows[dgvLlamados.SelectedRows.Count - 1].Cells["Longitud"].Value.ToString() +
                    "]";
                XmlNode xmlNodeEdificio = xmlDocEdificios.SelectSingleNode(consulta);
                if (xmlNodeEdificio != null) 
                {
                    classEdificiosSantiago edificio = new classEdificiosSantiago(xmlNodeEdificio, this.tilesFolder);
                    edificio.crearEmergencia();
                    if (System.IO.File.Exists(this.tilesFolder + "\\PointsOfInterest\\Emergencia.xml"))
                        System.IO.File.Delete(this.tilesFolder + "\\PointsOfInterest\\Emergencia.xml");
                }
            }
            this.mapa.actualizarGrupoEdificios();
            this.mapa.actualizarPuntosDeInteres();
            this.mapa.refresh();
        }
        private void dgvLlamados_DoubleClick(object sender, EventArgs e)
        {
            if (correlativo == 0)
            {
                correlativo = int.Parse(dgvLlamados.SelectedRows[dgvLlamados.SelectedRows.Count - 1].Cells["Correlativo"].Value.ToString());
                this.setEmergencia();
                MessageBox.Show("Se vinculo la emergencia satisfactoriamente.");
                tab.SelectedTab = tab.TabPages["panelMapa"];
            }
            else 
            {
                if (correlativo != int.Parse(dgvLlamados.SelectedRows[dgvLlamados.SelectedRows.Count - 1].Cells["Correlativo"].Value.ToString()))
                {
                    DialogResult result1 = MessageBox.Show("Ya esta vinculado a una emergencia." +
                       Environment.NewLine + "Esta seguro que desea vincularse a esta emergencia?",
                       "Validación", MessageBoxButtons.YesNo);
                    if (result1.ToString().Equals("Yes"))
                    {
                        correlativo = int.Parse(dgvLlamados.SelectedRows[dgvLlamados.SelectedRows.Count - 1].Cells["Correlativo"].Value.ToString());
                        this.eliminarEmergencia();
                        this.setEmergencia();
                        MessageBox.Show("Se vinculo la emergencia satisfactoriamente.");
                        tab.SelectedTab = tab.TabPages["panelMapa"];
                    }
                }
            }
            MCDSService.Clave = dgvLlamados.SelectedRows[dgvLlamados.SelectedRows.Count - 1].Cells["Clave"].Value.ToString();
        }
        public bool botonEdificio
        {
            get
            {
                return this.toolStripButton9.Checked;
            }
            set
            {
                this.toolStripButton9.Checked = value;
            }
        }

        private void dgvMaterialMayor_DoubleClick(object sender, EventArgs e)
        {
            if (this.mapa != null)
            {
                mapa.Centro = new LatLon(dgvMaterialMayor.SelectedRows[dgvMaterialMayor.SelectedRows.Count - 1].Cells["Latitud"].Value.ToString(),
                    dgvMaterialMayor.SelectedRows[dgvMaterialMayor.SelectedRows.Count - 1].Cells["Longitud"].Value.ToString());
                mapa.zoom(mapa.Zoom);
                mapa.refresh();
                tab.SelectedTab = tab.TabPages["panelMapa"];
            }
        }

        private void carrosCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            this.mapa.changeLayer("carros");
            mapa.zoom(mapa.Zoom);
            mapa.refresh();
        }


        private void recomendacionBotonMostrar_Click(Object sender, System.EventArgs e)
        {
            Button boton = (Button)sender;
            ucMCDS control = (ucMCDS)boton.Parent.Parent;


            mapa.Centro = control.Coordenadas;
            mapa.zoom(mapa.Zoom);
            mapa.refresh();
        }
        public string TilesFolder 
        {
            get 
            {
                return this.tilesFolder;
            }
        }

        private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            formPreferenciasMCDS preferencias = new formPreferenciasMCDS();
            preferencias.ShowDialog();
        }

        private void archivosDelServidorToolStripMenuItem_Click(object sender, EventArgs e)
        {

            if (correlativo != 0 && correlativo > 0)
            {
                WindowsFormsApplication7.formArchivos formArchivosEmergencia = new WindowsFormsApplication7.formArchivos(correlativo, tilesFolder);
                formArchivosEmergencia.ShowDialog(this);
            }
            else
            {
                MessageBox.Show("No se ha seleccionado una emergencia aun.");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.obtenerMaterialMayor();
        }
        public Boolean capaCarabineros 
        {
            get
            {
                return this.carabinerosCheckBox.Checked;
            }
        }

        public Boolean capaHospitales
        {
            get
            {
                return this.HospitalCheckBox.Checked;
            }
        }
        public Boolean capaCuartelesBomberos
        {
            get
            {
                return this.bombCheckBox.Checked;
            }
        }

        private void cbImagenSatelital_CheckedChanged(object sender, EventArgs e)
        {
            this.updateFiles();
        }

        private void cbImagenSatelital_EnabledChanged(object sender, EventArgs e)
        {
            if (this.mapa.varImagenSatelital)
                this.cbImagenSatelital.Checked = false;
        }
   }
}